#ifndef __MERCKU_UBUS_PROXY_INTERNAL_H__
#define __MERCKU_UBUS_PROXY_INTERNAL_H__

#include <core/mercku_error.h>
#include <core/gcc.h>
#include <libubus.h>

typedef struct
{
    void *priv;
} UbusProxySession;

MError *
ubus_proxy_session_new(const char *object, UbusProxySession **session);
void ubus_proxy_session_free(UbusProxySession *session);

typedef MError *(*MerckuUbusMethodHandler)(const char *json_req, char **json_resp);

MError *ubus_proxy_session_register_method(UbusProxySession *session, const char *method, MerckuUbusMethodHandler handler);
MError *ubus_proxy_session_listen(UbusProxySession *session);

enum
{
    MERCKU_UBUS_API_METHOD = 0,
    MERCKU_UBUS_API_PAYLOAD,
    MERCKU_UBUS_API_CNT
};

extern struct blobmsg_policy ubus_policy[MERCKU_UBUS_API_CNT];

/**
 * @brief 调用 ubus method，注意，此方法只针对 mercku ubus_policy.
 * 
 * @param session
 * @param object
 * @param method
 * @param json_req
 * @param json_resp
 */
MError *ubus_proxy_session_call_mercku_version(UbusProxySession *session, const char *object, const char *method, const char *json_req, char **json_resp);


typedef struct
{
    const char *object;
    const char *method;
    const char *json_req;
} UbusCallArgs;

/**
 * @brief 调用 ubus method。
 * 
 * @param response 返回的结果，需要调用者释放。请调用 tracable_free 方法。
*/
MError *ubus_proxy_session_call(IN UbusProxySession *session, IN const UbusCallArgs *args, OUT char **response);

/**
 * @brief 快速调用 ubus method。
 * @param response 返回的结果，需要调用者释放。请调用 tracable_free 方法。
*/
MError *ubus_fast_call(IN const UbusCallArgs *args, OUT char **response);

#endif // __MERCKU_UBUS_PROXY_INTERNAL_H__